package flyweightPattern

/**
 * 享元模式:
 * 使用共享对象可有效的支持大量细粒度的对象
 * 享元模式是以共享的方式高效的支持大量的细粒度对象,享元模式能做到共享的关键是区分内部状态和外部状态
 *
 * 内部状态是存储在享元对象内部的,可以共享的信息,并且不会随环境的改变而改变.
 * 外部状态是随环境改变而改变且不可共享的状态
 *
 * 优点:
 * 享元模式的优点在于大幅减少内存中对象的数量,降低程序的 内存占用,提高性能.
 * 缺点:
 * 享元模式增加了系统的复杂性
 *
 * 使用场景:ListView中的convertView
 *
 * 代码示例:
 * 模拟下围棋的过程,棋子接口ChessPiece是抽象享元,该接口中定义一个落子put()方法,对棋子的坐标进行定位.
 *
 * 思考:
 * 享元模式和原型模式,享元模式使用场景是对象复用,原型模式使用场景是对象不能复用
 * 享元模式:古时候的一夫多妻制,丈夫扮演的角色对于他的妻子们来说就可以看做一个享元对象.
 * 原型模式:小A为了找女朋,同时给10个女孩子都写了一封信,每封信的内容完全一样(I love you),但是还是得写十封不同的信(信的对象不能复用,想象一下,如果复用的话会发生什么情况)
 */
fun main() {
    ChessPieceFactory.getChessPiece(ChessPieceFactory.Type.BLACK).put(10, 10)
    ChessPieceFactory.getChessPiece(ChessPieceFactory.Type.WHITE).put(20, 10)
    ChessPieceFactory.getChessPiece(ChessPieceFactory.Type.BLACK).put(10, 20)
    ChessPieceFactory.getChessPiece(ChessPieceFactory.Type.WHITE).put(15, 15)
}